window.TreeSearch = (function() {
	/**
	 * 搜索树节点。该类提供逐个节点的搜索。 
	 * 为了保证客户端搜索效率必须要求对应的数据实体有一个能够表示上下级关系的字段，
	 * 比如根节点编码000，子节点有000000、000001、000002等依次类推。
	 * 
	 * 
	 * @param tree
	 *            树控件对象
	 * @param fieldName
	 *            树节点绑定的Entity的某个字段名称，用来判断其值是否与第三个参数中的元素值相同，如果为空则默认取id
	 * @param levelLength
	 *            维系上下级的字段基本长度，即每一级比上一级增长的长度，如果为空则默认取3
	 * @param codes
	 *            Array类型，是根据某些查询条件从服务器端返回的一组值，其元素需要与第二个参数做比对，相同则任务找到
	 */
	var TreeSearch = function(tree, fieldName, levelLength, codes) {
		this.codes = codes || [];
		this.length = this.codes.length;
		this.tree = tree;
		this.index = -1;
		this.levelLength = levelLength;
		this.fieldName = fieldName || "id";
	}
	TreeSearch.prototype._getLevel = function(code) {
		return code.length / this.levelLength;
	}
	TreeSearch.prototype._eachNode = function(nodes, code) {
		var cLevel = this._getLevel(code), stop = false;
		nodes.each(function(node) {
			if (node.get("level") == cLevel) {
				if (node.get("data").get(this.fieldName) == code) {
					// 找到
					this.tree.set("currentNode", node);
					stop = true;
					return false;
				}
			} else if (node.get("level") < cLevel) {
				if (!node.get("expanded")) {
					node.expand();
				}
				if (this._eachNode(node.get("nodes"), code)) {
					stop = true;
					return false;
				}
			} else {
				stop = true;
				return false;
			}
		}, this);
		return stop;
	}
	TreeSearch.prototype.findPrevNode = function() {
		if (this.length == 0) {
			dorado.widget.NotifyTipManager.notify("没有查找到任何数据！");
			return;
		}
		var taskId = dorado.util.TaskIndicator.showTaskIndicator(
				"正在搜索，请稍候......", "main");
		$setTimeout(this, function() {
			if (this.index == 0) {
				this.index = this.length;
			}
			var code = this.codes[--this.index];
			if (code) {
				var nodes = this.tree.get("root").get("nodes");
				this._eachNode(nodes, code);
			}
			dorado.util.TaskIndicator.hideTaskIndicator(taskId);
		}, 100);
	}
	TreeSearch.prototype.findNextNode = function() {
		if (this.length == 0) {
			dorado.widget.NotifyTipManager.notify("没有查找到任何数据！");
			return;
		}
		var taskId = dorado.util.TaskIndicator.showTaskIndicator(
				"正在搜索，请稍候......", "main");
		$setTimeout(this, function() {
			if (this.index == this.length - 1) {
				this.index = -1;
			}
			var code = this.codes[++this.index];
			if (code) {
				var nodes = this.tree.get("root").get("nodes");
				this._eachNode(nodes, code);
			}
			dorado.util.TaskIndicator.hideTaskIndicator(taskId);
		}, 100);
	}
	return TreeSearch;
})();